package com.base.cn.platform.os.service.manage.subject;

import com.base.cn.platform.os.entity.manage.subject.SysSubject;
import com.base.cn.platform.os.service.FeignAuthConfig;
import com.base.cn.platform.os.service.manage.BaseService;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 专业接口
 *
 * @author s.li
 * @create 2018-03-20 15:26
 */
@FeignClient(name =  BaseService.appName,configuration = FeignAuthConfig.class)
public interface SubjectService extends BaseService {

    /**
     * 保存专业
     * @param subject 专业数据对象
     * @return Map<String,Object>
     */
    @RequestMapping(contextPath+"/saveSubject")
    Map<String,Object> saveSubject(@RequestBody Map<String, Object> subject);

    /**
     * 通过专业ID，查询专业数据对象
     * @param subjectId 专业ID
     * @return 专业数据对象
     */
    @RequestMapping(contextPath+"/findSubjectById")
    Map<String,Object> findSubjectById(@RequestParam("subjectId") BigDecimal subjectId);

    /**
     * 专业/科目修改状态
     * @param ids 专业ID串
     * @param status 状态，1正常，2禁用，3删除
     * @return主Map<String,Object>
     */
    @RequestMapping(contextPath+"/updateSubjectStatus")
    Map<String,Object> updateSubjectStatus(@RequestParam("subjectIds") String ids, @RequestParam("status") int status);

    /**
     * 修改专业/科目父级的关联
     * @param subjectId 专业ID
     * @param parentId 新的父级ID
     * @return Map<String,object>
     */
    @RequestMapping(contextPath+"/updateSubjectParentId")
    Map<String,Object> updateSubjectParentId(@RequestParam("subjectId") BigDecimal subjectId, @RequestParam("parentId") BigDecimal parentId);

    /**
     * 获取专业Map，以父级ID为条件分组
     * @param subject 查询条件
     * @return Map<String,List<String,Object>>
     */
    @RequestMapping(contextPath+"/findSubjectListMap")
    Map<String,List<Map<String,Object>>> findSubjectListMap(@RequestBody(required = false) Map<String, Object> subject);

    /**
     * 获取分层好的专业/科目数据
     * @param subject 查询条件
     * @return  List<Subject>
     */
    @RequestMapping(contextPath+"/findLayeredSubjectList")
    List<Map<String,Object>> findLayeredSubjectList(@RequestBody(required = false) Map<String, Object> subject);

    /**
     * 查询专业科目列表，通过ID为KEY转成Map
     * @param subject 查询条件
     * @return Map<BigDecimal,Subject>
     */
    @RequestMapping(contextPath + "/findSubjectToIdMap")
    Map<BigDecimal, SysSubject> findSubjectToIdMap(@RequestBody(required = false) Map<String, Object> subject);

    /**
     * 查询原始专业/科目数据列表
     * @param subject 查询条件
     * @return List<Subject>
     */
    @RequestMapping(contextPath+"/findSubjectList")
    List<Map<String,Object>> findSubjectList(@RequestBody(required = false) Map<String, Object> subject);

    /**
     * 获取管理员用户的专业列表
     * @param userId 管理员用户ID
     * @return 专业列表
     */
    @RequestMapping(contextPath+"/findSysUserSubjectList")
    List<Map<String,Object>> findSysUserSubjectList(@RequestParam("userId") BigDecimal userId);


    /**
     * 根据父级IDS获取科目
     * @param parentIds 管理员用户ID
     * @return 专业列表
     */
    @RequestMapping(contextPath + "/findSysSubSubjectList")
    List<Map<String,Object>> findSysSubSubjectList(@RequestParam("parentIds") String parentIds);

    /**
     * 获取要给角色设置的所有的专业，不区分状态
     * @return 分层好的专业列表
     */
    @RequestMapping(contextPath + "/findSetRoleAllSubjectList")
    List<Map<String,Object>> findSetRoleAllSubjectList();

    /**
     * 获取H5首页推荐的专业
     * @return  List<SysSubject>专业列表
     */
    @RequestMapping(contextPath + "/findH5IndexSubjectList")
    List<Map<String,Object>> findH5IndexSubjectList();

    /**
     * 调整排序
     * @param currentId 要操作的节点ID
     * @param currentSort 操作的节点的新排序
     * @param oldId 被替换节点的ID
     * @param oldSort 被替换节点的排序
     * @return Map<String,Object>
     */
    @RequestMapping(contextPath + "/updateNodeSort")
    void updateNodeSort(@RequestParam("currentId") BigDecimal currentId,
                        @RequestParam("currentSort") int currentSort,
                        @RequestParam("oldId") BigDecimal oldId,
                        @RequestParam("oldSort") int oldSort);
}
